package com.atguigu.bigdata.scala.chapter06

import scala.beans.BeanProperty

object Scala07_Object_Field_2 {
    def main(args: Array[String]): Unit = {

        // TODO 面向对象编程 - 属性
        // scala中类的属性到底是什么?
        // 属性其实就是属性，但是访问这个属性时，就等同于方法属性对应的方法

        val user = new User()
        // 给对象的属性赋值，其实等同于调用底层对象的属性set方法
        user.name = "lisi"
        user.setName("wangwu")

        // 访问对象的属性，其实等同于调用底层对象的属性get方法
        println(user.name)
        println(user.getName)

        // scala生成属性所谓的set，get方法，不符合Bean规范，所以和一些技术框架无法集成的。
        // scala中可以采用注解的方式解决这个问题。增加注解后，编译器会自动生成符合Bean规范的set，get方法

        // 如果属性采用val声明，属性采用final修饰，因为不能修改，所以底层不会生成set方法

        // 属性采用下划线初始化，和java中属性的默认值初始化一致
        // 属性采用private修饰，那么对应的set，get方法的权限也是private的
    }
    class User {
        // 声明属性
        /*
          类中声明属性，但是在编译时，编译器会生成私有的属性
          同时，也生成了2个公共的方法，用于访问这个属性
          private String name = "zhangsan";

          // 这个方法类似于bean对象的get方法
          public String name() {
             return this.name;
          }

          // 这个方法类似于bean对象的set方法
          public void name_$eq(final String x$1) {
             this.name = x$1;
          }

         */
        @BeanProperty var name : String = "zhangsan"
        @BeanProperty val age : Int = 30
        private var sex : String = _
        //var age : Int = _
    }
}